#include<bits/stdc++.h>
#include<windows.h>

using namespace std;

const int PageSize = 100; // 定义每页的大小为100
const int PageCount = 5;  // 定义页数为5
const int MAX_ITERATIONS = 10; // 定义最大迭代次数为10
const int BUFFER_SIZE = 101; // 定义缓冲区大小为101

int flag[5]; // 定义一个标志数组，用于标记每一页是否被访问过
int present=0; // 定义一个指针，用于指向当前的页

// 获取一个空白页的函数
int getBlankPage(){
    while(true){
        // 如果当前页没有被访问过，返回当前页的编号
        if(flag[present]==0){
            int result = present;
            present = (present + 1) % 5;
            return result;
        }
        // 如果当前页被访问过，将其标记为未访问，并将指针移动到下一页
        flag[present] = 0;
        present = (present + 1) % 5;
    } 
}

// 创建命名管道的函数
HANDLE createMemoryPipe() {
    HANDLE memoryPipe=CreateNamedPipe(
        TEXT("\\\\.\\Pipe\\memoryPipe"),
        PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
        1,
        1024,
        1024,
        0,
        NULL
    );
    // 如果创建管道失败，输出错误信息并退出程序
    if(memoryPipe==INVALID_HANDLE_VALUE){
        cerr<<"Create pipe failed: "<<GetLastError()<<endl;
        system("pause");
        exit(0);
    }
    // 返回管道的句柄
    return memoryPipe;
}

// 清空缓冲区的函数
void clearBuffer(CHAR* buffer, int size) {
    memset(buffer, '\0', size);
}

// 处理客户端连接的函数
void handleClientConnection(HANDLE memoryPipe) {
    CHAR IO[BUFFER_SIZE];
    CHAR voidPage[BUFFER_SIZE];
    DWORD dwNumberOfBytesRead = 0;
    DWORD dwNumberOfBytesWritten = 0;

    for(int i = 0; i < MAX_ITERATIONS; i++){
        // 清空输入输出缓冲区
        clearBuffer(IO, sizeof(IO));
        // 从管道中读取数据
        if (!ReadFile(memoryPipe, IO, sizeof(IO), &dwNumberOfBytesRead, NULL)) {
            break;
        }

        // 获取一个空白页
        int page = getBlankPage();
        // 将获取到的空白页标记为已访问
        flag[page] = 1;

        // 清空voidPage缓冲区，并将获取到的空白页的编号写入voidPage
        clearBuffer(voidPage, sizeof(voidPage));
        snprintf(voidPage, sizeof(voidPage), "%d", page);
        // 将voidPage中的数据写入管道
        if (!WriteFile(memoryPipe, voidPage, strlen(voidPage), &dwNumberOfBytesWritten, NULL)) {
            break;
        }
    }
}

int main(){
    // 创建内存映射文件对象
    HANDLE hMapFile=CreateFileMapping(
        INVALID_HANDLE_VALUE,
        NULL,
        PAGE_READWRITE,
        0,
        PageSize*PageCount,
        TEXT("memoryMapFile")
    );

    // 创建命名管道
    HANDLE memoryPipe = createMemoryPipe();

    // 等待客户端连接管道
    if(ConnectNamedPipe(memoryPipe,NULL)){
        // 处理客户端的连接请求
        handleClientConnection(memoryPipe);
    }
    // 清空管道的缓冲区
    FlushFileBuffers(memoryPipe);
    // 断开管道的连接
    DisconnectNamedPipe(memoryPipe);
    // 关闭管道
    CloseHandle(memoryPipe);
    // 暂停程序，等待用户输入
    system("pause");
    return 0;
}